/*
Eteria IRC Client, an RFC 1459 compliant client program written in Java.
Copyright (C) 2000  Javier Kohen <jkohen at tough.com>

This program is free software; you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation; either version 2 of the License, or
(at your option) any later version.

This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
GNU General Public License for more details.

You should have received a copy of the GNU General Public License
along with this program; if not, write to the Free Software
Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
*/

package ar.com.jkohen.awt;

import java.awt.*;

public class NickInfoPopup extends Canvas
{
    private final int H_GAP = 2;
    private final int V_GAP = 2;

    // Just guessing here.
    public static int IMAGE_WIDTH = 160;
    public static int IMAGE_HEIGHT = 14;

    private String nick;
	private boolean show = true;

    private Image image;
    private Graphics img_gfx;

    private Rectangle bounds;

    private boolean rendered;

    public NickInfoPopup()
    {
    	this.setBackground(Color.white);
		this.bounds = new Rectangle(IMAGE_WIDTH, 0);
    }

    public String getNick()
    {
		return(nick);
    }

	public void setNick(String n)
    {
		this.nick = n;
		setVisible(true);
    }
	
	private String getInfoString(String nick)
	{
		String line = "";
		int	age = NickInfo.getAge(nick);
		char sex = NickInfo.nickToChar(nick);
		String location = NickInfo.getLocation(nick);
		String description = NickInfo.getDescription(nick);
		if (description == null)
			line = (age > 0 ? String.valueOf(age) : "  ") + " " + sex + " " + (location != null ? location : "");
		else
			line = description;
			
		return(line);
	}
	
	private Color getInfoColor(String nick)
	{
		return(NickInfo.nickToColor(nick));
	}
	
    public void setVisible(boolean b)
    {
		this.show = b;
		if (show)
		{
			show(nick);
		}
		else
		{
			this.nick = null;
			if (img_gfx != null)
			{
				this.image = null;
				this.img_gfx.dispose();
			}
		}
    }
 
    private void show(String n)
    {
		if (nick == null || nick.equals(""))
			return;
			
		// Render the info off-screen.
		if (image == null)
		{
			Font f = new Font(getFont().getName(), Font.PLAIN, getFont().getSize() - 1);
			FontMetrics fm = getFontMetrics(f);
			IMAGE_HEIGHT = fm.getLeading() + fm.getAscent() + fm.getDescent() + V_GAP * 2;
	    	this.image = createImage(IMAGE_WIDTH, IMAGE_HEIGHT);
	    	this.img_gfx = image.getGraphics();
	    	this.img_gfx.setFont(f);
		}

		this.nick = n;
		this.show = true;
		render(img_gfx);
		rendered = false;
    }

    private void render(Graphics g)
    {
		FontMetrics fm = g.getFontMetrics();
		int text_max_height = fm.getLeading() + fm.getAscent() + fm.getDescent();
		int text_baseline = fm.getLeading() + fm.getAscent();

		bounds.height = text_max_height + V_GAP * 2;

		String infos = getInfoString(nick);
 		Color col1 = getInfoColor(nick);
 		int rd = col1.getRed();
 		int gr = col1.getGreen();
 		int bl = col1.getBlue();
 		int a = 128;
 		Color col2 = new Color((rd + a > 255 ? 255 : rd + a), (gr + a > 255 ? 255 : gr + a), (bl + a > 255 ? 255 : bl + a));

    	// Clear background.
    	g.setColor(Color.black);
    	g.fillRect(2, 2, IMAGE_WIDTH - 2, IMAGE_HEIGHT - 2);
		g.setColor(col1);
    	g.fillRect(0, 0, IMAGE_WIDTH - 1, IMAGE_HEIGHT - 1);
		g.setColor(col2);
		g.fillRect(1, 1, IMAGE_WIDTH - 3, IMAGE_HEIGHT - 3);

    	// Render the text.
		g.setColor(Color.black);
   	    g.drawString(infos, H_GAP, text_baseline + V_GAP);
    }

	public void update(Graphics g)
    {
		paint(g);
    }
	
    public void paint(Graphics g)
    {
		// Copy the info from the off-line buffer.
		if (show && image != null)
		{
    	    Dimension parent_size = getParent().getSize();

    	    bounds.x = Math.min(bounds.x, parent_size.width - bounds.width);
    	    bounds.x = Math.max(bounds.x, 0);

    	    bounds.y -= bounds.height;
    	    bounds.y = Math.min(bounds.y, parent_size.height - bounds.height);
    	    bounds.y = Math.max(bounds.y, 0);

    	    g.drawImage(image, bounds.x, bounds.y, this);
    	}
    }

    public void setFont(Font f)
    {
    	if (img_gfx != null)
			img_gfx.setFont(new Font(f.getName(), Font.PLAIN, f.getSize() - 1));
    }
    
    public void setLocation(int x, int y)
    {
		bounds.setLocation(x, y);
    }

    public void setLocation(Point p)
    {
		bounds.setLocation(p);
    }

    public Point getLocation()
    {
		return(new Point(bounds.x, bounds.y));
    }
    
	public Dimension getSize()
    {
		return new Dimension(IMAGE_WIDTH, IMAGE_HEIGHT);
    }
	
    public Dimension getPreferredSize()
    {
		// We don't want to be drawn by the AWT.
		return new Dimension(0, 0);
    }
 
    public Dimension getMinimumSize()
    {
		return getPreferredSize();
    }
}
